package com.sunday.common.core.lambda;

import com.sunday.common.core.lambda.toolkit.LambdaUtils;
import com.sunday.common.core.lambda.toolkit.support.SFunction;
import com.sunday.common.core.utils.StringUtils;
import org.springframework.util.ReflectionUtils;

import java.lang.reflect.Field;

/**
 * lambda operation
 *
 * @author zsy
 * @since 2024/1/16
 */
public interface LambdaOperation {

    /**
     * 通过对象和属性名 获取 字段的当前值
     *
     * @param field  字段
     * @param source 对象
     * @return {@link Object}
     */
    static Object getField(Field field, Object source) {
        return ReflectionUtils.getField(field, source);
    }

    /**
     * 通过 function 获取 实例化该方法的类
     *
     * @param func 函数 例如 User::getName
     * @return {@link java.lang.Class<?>} 实例化该方法的类
     */
    static <T> Class<?> getInstantiatedClass(SFunction<T, ?> func) {
        return LambdaUtils.extract(func).instantiatedClass();
    }

    /**
     * 通过 function 获取 属性名
     *
     * @param func 函数 例如 User::getName
     * @return {@link java.lang.String} 属性名
     */
    static <T> String getFieldName(SFunction<T, ?> func) {
        return StringUtils.resolveFieldName(LambdaUtils.extract(func).implMethodName());
    }

    /**
     * 通过 function 获取 字段注解内容
     *
     * @param func
     * @return {@link String}
     */
    <T> String getColumnName(SFunction<T, ?> func);

    /**
     * 通过类和属性名 获取 字段注解内容 (未匹配则返回 fieldName)
     *
     * @param target
     * @param fieldName
     * @return {@link String}
     */
    String getColumnName(Class<?> target, String fieldName);

}
